package cn.demoncat.util.mq.entity;

import cn.demoncat.util.lang.IDUtil;
import cn.demoncat.util.lang.JsonUtil;
import cn.demoncat.util.lang.StringUtil;
import cn.demoncat.util.lang.constant.StatusConstant;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import org.apache.commons.lang3.StringUtils;

import java.io.Serializable;
import java.util.List;
import java.util.Objects;

/**
 * MQ消息（通用）
 * 
 * @author 延晓磊
 *
 * @since 2017年9月6日
 */
public class MqMessage implements Serializable{
 
	private static final long serialVersionUID = 1L;

	//数据的ID - String类型的ID
	private String strId;
	//数据的ID - Long类型的ID
	private Long numId;
	//操作类型：MqOptType
	private String optType;
	//消息正文 - 处理的对象(JSON串)，查询条件，路由标记、具体消息等
	private String msg;
	//消息的ID
	private String msgId;
	//是否为延时消息
	private String delay;
	//延迟时间：秒数，时间
	private String delayTime;

	public MqMessage() {}

	/**
	 * 构建
	 * 
	 * @return
	 * 
	 * @author 延晓磊
	 *
	 * @since 2020年1月2日
	 */
	public static MqMessage build() {
		MqMessage message = new MqMessage();
		message.msgId = IDUtil.getSnowflakeId();
		message.delay = StatusConstant.Common.NO;
		return message;
	}
	
	/**
	 * 构建
	 * 
	 * @param id		字符串ID
	 * @return
	 * 
	 * @author 延晓磊
	 *
	 * @since 2020年1月2日
	 */
	public static MqMessage build(String id) {
		return build().setStrId(id);
	}
	
	/**
	 * 构建
	 * 
	 * @param id		整数ID
	 * @return
	 * 
	 * @author 延晓磊
	 *
	 * @since 2020年1月2日
	 */
	public static MqMessage build(Long id) {
		return build().setNumId(id);
	}
	
	/**
	 * 构建
	 * 
	 * @param numId		整数ID
	 * @param strId		字符串ID
	 * @return
	 * 
	 * @author 延晓磊
	 *
	 * @since 2020年1月2日
	 */
	public static MqMessage build(Long numId, String strId) {
		return build().setStrId(strId).setNumId(numId);
	}
	
	/**
	 * 设置消息内容
	 * 
	 * @param msg	消息内容：对象(转JSON串)，查询条件，路由标记、具体消息等
	 * @return
	 * 
	 * @author 延晓磊
	 *
	 * @since 2020年1月2日
	 */
	public MqMessage msg(Object msg) {
		this.msg = JsonUtil.toStr(msg);
		return this;
	}
	
	/**
	 * 设置操作类型
	 * 
	 * @param optType	操作类型：MqOptType
	 * @return
	 * 
	 * @author 延晓磊
	 *
	 * @since 2020年1月2日
	 */
	public MqMessage opt(String optType) {
		this.optType = optType;
		return this;
	}

	/**
	 * 设置为延时消息
	 *
	 * @param delayTime
	 *
	 * @return
	 *
	 * @author 延晓磊
	 *
	 * @since 2020年1月2日
	 */
	public MqMessage delay(String delayTime) {
		this.delayTime = delayTime;
		return this.setDelay(StatusConstant.Common.YES);
	}

	/**
	 * 获取消息KEY
	 *
	 * @param key
	 * @return
	 *
	 * @author 延晓磊
	 * @since 2021年02月23日
	 */
	public String key(String key){
		if (StringUtils.isBlank(key)) {
			if (StringUtils.isNotBlank(this.getStrId())) {
				key = this.getStrId();
			}else{
				key = StringUtil.toString(this.getNumId());
			}
		}
		return key;
	}

	/**
	 * 解析消息对象
	 * 
	 * @return Map
	 * 
	 * @author 延晓磊
	 *
	 * @since 2018年8月9日
	 */
	public JSONObject parseMsg() {
		return JsonUtil.parseObject(this.getMsg());
	}
	
	/**
	 * 解析消息对象
	 * 
	 * @return List
	 * 
	 * @author 延晓磊
	 *
	 * @since 2018年8月9日
	 */
	public JSONArray parseMsgList() {
		return JsonUtil.parseArray(this.getMsg());
	}
	
	/**
	 * 解析消息对象
	 * 
	 * @param clazz	对象类型
	 * @return Obj
	 * 
	 * @author 延晓磊
	 *
	 * @since 2018年8月9日
	 */
	public <T>T parseMsg(Class<T> clazz) {
		return JsonUtil.parse(this.getMsg(), clazz);
	}
	
	/**
	 * 解析消息对象
	 * 
	 * @param clazz	对象类型
	 * @return List
	 * 
	 * @author 延晓磊
	 *
	 * @since 2018年8月9日
	 */
	public <T>List<T> parseMsgList(Class<T> clazz) {
		return JsonUtil.parseList(this.getMsg(), clazz);
	}

	/**
	 * 数据ID
	 *
	 * @return  strId || numId
	 */
	public String getId() {
		return strId == null ? (numId == null ? null : numId.toString()) : strId;
	}

	/**
	 * 数据ID
	 *
	 * @return
	 */
	public String getStrId() {
		return strId;
	}
	/**
	 * 数据ID
	 *
	 * @return
	 */
	public MqMessage setStrId(String strId) {
		this.strId = strId;
		return this;
	}
	/**
	 * 数据ID
	 *
	 * @return
	 */
	public Long getNumId() {
		return numId;
	}
	/**
	 * 数据ID
	 *
	 * @return
	 */
	public MqMessage setNumId(Long numId) {
		this.numId = numId;
		return this;
	}

	/**
	 * 消息分类
	 *
	 * @return
	 */
	public String getOptType() {
		return optType;
	}
	/**
	 * 消息分类
	 *
	 * @return
	 */
	public MqMessage setOptType(String optType) {
		this.optType = optType;
		return this;
	}

	/**
	 * 消息ID
	 *
	 * @return
	 */
	public String getMsgId() {
		return msgId;
	}
	/**
	 * 消息ID：build时生成，正常情况不要修改
	 *
	 * @return
	 */
	public void setMsgId(String msgId) {
		this.msgId = msgId;
	}

	/**
	 * 消息正文
	 *
	 * @return
	 */
	public String getMsg() {
		return msg;
	}
	/**
	 * 消息正文
	 *
	 * @return
	 */
	public MqMessage setMsg(String msg) {
		this.msg = msg;
		return this;
	}

	/**
	 * 是否延时
	 *
	 * @return
	 */
	public String getDelay() {
		return delay;
	}

	/**
	 * 是否延时
	 *
	 * @return
	 */
	public MqMessage setDelay(String delay) {
		this.delay = delay;
		return this;
	}

	/**
	 * 延迟时间、秒数
	 *
	 * @return
	 */
	public String getDelayTime() {
		return delayTime;
	}

	/**
	 * 延迟时间、秒数
	 *
	 * @return
	 */
	public void setDelayTime(String delayTime) {
		this.delayTime = delayTime;
	}

	@Override
	public boolean equals(Object o) {
		if (this == o) return true;
		if (o == null || getClass() != o.getClass()) return false;
		MqMessage mqMessage = (MqMessage) o;
		return Objects.equals(strId, mqMessage.strId) &&
				Objects.equals(numId, mqMessage.numId) &&
				Objects.equals(optType, mqMessage.optType) &&
				Objects.equals(msg, mqMessage.msg) &&
				Objects.equals(msgId, mqMessage.msgId) &&
				Objects.equals(delay, mqMessage.delay) &&
				Objects.equals(delayTime, mqMessage.delayTime);
	}

	@Override
	public int hashCode() {
		return Objects.hash(strId, numId, optType, msg, msgId, delay, delayTime);
	}

	@Override
	public String toString() {
		return "MqMessage{" +
				"strId='" + strId + '\'' +
				", numId=" + numId +
				", optType='" + optType + '\'' +
				", msg='" + msg + '\'' +
				", msgId='" + msgId + '\'' +
				", delay='" + delay + '\'' +
				", delayTime='" + delayTime + '\'' +
				'}';
	}
}
